#pragma once
#include "stdafx.h"
#include "RealFunction.h"
#include "testing.h"

/*  Create a linearly spaced vector */
std::vector<double> linspace(double from, double to, int numPoints);
/*  Compute the sum of a vector */
double sum(const std::vector<double>& v);
/*  Compute the mean of a vector */
double mean(const std::vector<double>& v);
/*  Compute the standard deviation of a vector */
double standardDeviation(const std::vector<double>& v, bool population = 0);
/*  Find the minimum of a vector */
double min(const std::vector<double>& v);
/*  Find the maximum of a vector */
double max(const std::vector<double>& v);
/*  Find the given percentile of a vector */
double prctile(const std::vector<double>& v, double percentage);
/*  Sort a vector */
std::vector<double> sort(const std::vector<double>& v);

/*  Create uniformly distributed random numbers */
std::vector<double> randuniform(int n);
/*  Create normally distributed random numbers */
std::vector<double> randn(int n);
/*  Seeds the default random number generator */
void rng(const std::string& setting);

/**
 *  Computes the cumulative
 *  distribution function of the
 *  normal distribution
 */
double normcdf(double x);

/* Computes the inverse of normcdf */
double norminv(double x);


/*  Create a line chart */
void plot(const std::string& fileName,
    const std::vector<double>& x,
    const std::vector<double>& y);

/*  Plot a histogram */
void hist(const std::string& fileName,
    const std::vector<double>& values,
    int numBuckets = 10);

/*  Integrate using the rectangle rule */
double integral(RealFunction& f,
    double a,
    double b,
    int nSteps);

/*  Integrate f from x to infinity using a substitution
    followed by the rectangle rule */
double integralToInfinity(RealFunction& f,
    double x,
    int nSteps);

/*  Integrate f over the whole of R
by two applications of integral to Infinity */
double integralOverR(RealFunction& f,
    int nSteps);




/**
 *  Test function
 */
void testMatlib();